package com.mazaiting.mybatisplus.sensitive.provider;

import com.mazaiting.mybatisplus.sensitive.FiledSensitive;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * 被加密属性处理类
 * @author danghailiang
 */
public class SensitiveFieldsProvider {
    /**
     * 实体为Key，存储待脱敏属性值
     */
    private static final Map<Class<?>, Set<Field>> SENSITIVE_FIELD_CACHE = new ConcurrentHashMap<>();

    /**
     * 获取实体字节码对象
     * @param parameterClass 字节码对象
     * @return 返回需要被脱敏的属性值
     */
    public static Set<Field> get(Class<?> parameterClass) {
        // 计算字节码对象，不存在就添加到hashmap中
        return  SENSITIVE_FIELD_CACHE.computeIfAbsent(parameterClass, aClass -> {
            // lamdba表达式获取所有属性值
            Field[] declaredFields = aClass.getDeclaredFields();
            // 数组转集合，filter过滤器，只保留符合条件的属性(既需要被加密的属性)
            return Arrays.stream(declaredFields).filter(field ->
                            // 过滤器条件(判断是否是该注解)
                            field.isAnnotationPresent(FiledSensitive.class) && field.getType() == String.class)
                    .collect(Collectors.toSet());
        });
    }
}
